import { getNewCartGoods } from "@/api/cart";

//购物车vuex模块(state,mutation,actions)
export default {
  // 开启命名空间，彻底分离模块
  namespaced: true,
  state() {
    return {
      //购物车商品列表
      list: [],
    };
  },
  getters: {
    // 有效商品列表
    // 有库存，并且有效
    validList(state) {
      return state.list.filter(item => item.stock && item.isEffective)
    },
    // 有效商品总件数
    validTotal(state, getters) {
      return getters.validList.reduce((p, c) => p + c.count, 0)
    },
    // 有效商品总金额
    validAmount(state, getters) {
      return getters.validList.reduce((p, c) => p + c.nowPrice * 100 * c.count, 0) / 100
    },
    // 准备数据：已选择的商品列表，计算已经选择商品总件数，计算已经选择商品总数，全选按钮的状态
    // 已选择商品列表
    selectedList(state, getters) {
      return getters.validList.filter((item) => item.selected)
    },
    // 计算已选择商品总件数
    selectedTotal(state, getters) {
      return getters.selectedList.reduce((p, c) => p + c.count, 0)
    },
    // 计算已选的商品总金额
    selectedAmount(state, getters) {
      return getters.selectedList.reduce((p, c) => p + c.nowPrice * 100 * c.count, 0) / 100
    },
    // 全选状态(选中的数据的长度，等于全部有效商品的长度，特殊情况不能为0)
    isCheckAll(state, getters) {
      return getters.selectedList.length === getters.validList.length && getters.selectedList.length !== 0
    }
  },
  mutations: {
    // 这里是做加入购物车的操作
    insertCart(state, goods) {
      // 如果购物车中已经存在对应的skuId的商品，数量累加(更新，添加商品，需要展示在前面)
      // 1.判断购物车中有没有相同的商品
      const sameIndex = state.list.findIndex(item => item.skuId === goods.skuId)
      if (sameIndex >= 0) {
        // 购物车已经有了这个商品，数量累加即可
        //现在商品的数量=以前商品的数量+现在添加的数量
        goods.count = state.list[sameIndex].count + goods.count
        // 删除之前的商品
        state.list.splice(sameIndex, 1)
      }
      state.list.unshift(goods)
    },
    updateCart(state, goods) {
      // 支持购物车数据更新 goods={nowPrice,stock,isTffective}
      // 将来，支持选中与不选中selected,此时的goods={selected:false|true}
      // 将来支持修改数据goods={count:2}
      // 如果传的值是不符合要求的就不做修改
      const updateGoods = state.list.find(item => item.skuId === goods.skuId)
      for (const key in goods) {
        const value = goods[key]//需要改的值
        // 这里是修改一些无效值
        if (value !== null && value !== undefined && value !== "") {
          updateGoods[key] = value
        }
      }
    },
    // 删除
    deleteCart(state, skuId) {
      const index = state.list.findIndex((item) => item.skuId === skuId)
      state.list.splice(index, 1)
    }
  },
  actions: {
    async insertCart(ctx, goods) {
      // 需要做两件事
      // 已登录：调用接口更新数据
      // 未登录：调用mutations更新数据即可，因为做了数据持久化，就可以自动存储到本地
      // 如何判断登录状态(根据token判断)
      // 这里有ctx参数是一个对象里面包含有state,rootState,commit,dispatch,getters,rootGetter
      if (ctx.rootState.user.profile.token) {
        // TODO：如果判断里面有值就是已登录
      } else {
        // 未登录：调用mutations更新数据，自动存储本地
        // 调用mutations函数，将goods的值传给它
        ctx.commit('insertCart', goods)
      }
    },
    async getCartList(ctx) {
      if (ctx.rootState.user.profile.token) {
        // TODO已登录：调用接口去更新数据
      } else {
        // 未登录
        // 每个商品都需要更新，都需要调用接口，并发发请求（同时发请求）
        const promiseArr = ctx.state.list.map((item) => getNewCartGoods(item.skuId))
        const results = await Promise.all(promiseArr)
        // console.log(results);
        results.forEach((item, i) => {
          // list promiseArr results 三者顺序是一样的
          ctx.commit('updateCart', { skuId: ctx.state.list[i].skuId, ...item.result })
        })
      }
    },
    async deleteCart(ctx, skuId) {
      if (ctx.rootState.user.profile.token) {
        // TODO:登录
      } else {
        ctx.commit('deleteCart', skuId)
      }
    },
    async updateCart(ctx, goods) {
      if (ctx.rootState.user.profile.token) {
        // TODO:已登录：调用接口去更新数据
      } else {
        ctx.commit('updateCart', goods)
      }
    },
    // 全选
    async checkAllCart(ctx, selected) {
      if (ctx.rootState.user.profile.token) {
        // TODO:已登录：调用接口去更新数据
      } else {
        // 未登录
        ctx.getters.validList.forEach(item => {
          ctx.commit('updateCart', { skuId: item.skuId, selected })
        })
      }
    },
    // 批量删除商品 
    async batchDeleteCart(ctx) {
      if (ctx.rootState.user.profile.token) {
        // TODO:已登录：调用接口去更新数据
      } else {
        // 未登录(本地)
        // 1.获取选中的商品的列表，进行遍历调用deleteCart mutations函数
        ctx.getters.selectedList.forEach(item => {
          ctx.commit('deleteCart', item.skuId)
        })

      }
    }
  }
};
